import CompoundPath = require('./CompoundPath');
import FMatrix = require('./FMatrix');
import Point = require('./Point');

export = ParaChar;


/**
 * 文字
 * @author jackliu
 *
 */
class ParaChar extends CompoundPath{
    // 子的baseline的坐标
    public bx:number=0;
    public by:number=0;
        
    public m:FMatrix=null; // 变换矩阵，在文字时有效；其它情况无效（相对于原始轮廓（从服务器返回的轮廓）的绝对缩放矩阵）
       
    public line: number=0; // 辅助信息，行数，不需要序列化
    
	public constructor() {
        super();
	}
	
    // 转成json字符串
    // 参数： frame为true，表示转成frame（所谓frame指的是文字的每个字的x、y、w、h，matrix但不包括文字的每个点）
    public toJson  (frame?){
        frame = (frame)? true:false;
                
        var ret = '{';
                        
            // 如果frame为true，不需要存储paths
            if(!frame){
                // 去掉父json字符串的头尾
                var superJson = super.toJson();
                superJson = superJson.substr(1,superJson.length-2);
                
                ret += superJson;
                ret +=',';
            }
                    
            
            ret+=('"bx":'+Point.removeZero(this.bx));
            ret +=',';
            ret+=('"by":'+Point.removeZero(this.by));
                    
            // matrix
            if(this.m){
                ret +=',';
                ret +=('"m":'+this.m.toJson());
            }
                    
            ret +='}';
            return ret;
        }
        // 从json对象中解析
        // 参数： frame为true，表示从frame中解析（所谓frame指的是文字的每个字的x、y、w、h，但不包括文字的每个点）
        public fromJson (jsonObj, versionId,frame?){
            
            
            frame = (typeof frame ==undefined || typeof frame ==undefined)? false:frame;
                    
            
            if(jsonObj.hasOwnProperty("bx"))
                this.bx=Point.removeZero(jsonObj.bx);
            if(jsonObj.hasOwnProperty("by"))
                this.by=Point.removeZero(jsonObj.by);
                            
            // 如果frame为true，不需要解析paths
            if(!frame){
                super.fromJson( jsonObj, versionId );
            }
                    
            // matrix
            if(jsonObj.hasOwnProperty('m')){
                this.m = new FMatrix();
                this.m.fromJson(jsonObj.m);
            }
        }
            
        // 调整复合路径，平移或者缩放
        // 参数
        //		charContour:复合路径
        //		vW:水平方向的平移值或者缩放值
        //		vH:垂直方向的平移值或者缩放值
        // 		type:类型，1 平移  2 缩放
        public adjustPosition(vW,vH, type) {
            super.adjustPosition( vW, vH, type );        
            if(2==type){
                
                this.bx *= vW;
                this.by *= vH;
                
            }else{
                
                
            }
                    
        }
        
        /**
* 转换成SVG格式的字符串：
*      'M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90 z
*       M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90 z'
*/
        public toSvgPath=function(){
            var ret="";
            for(var i=0;i<this.paths.length;i++) {
                if(i>0)
                    ret+=" ";
                ret+=this.paths[i].toSvgPath(this.bx,this.by);
            }
            return ret;
        }
        /**
* 转换成SVG格式的字符串数组：
*      ['M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90 z',
*       'M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90 z']
*/
        public toSvgPathArray=function():Array<string> {
            var ret:Array<string> = new Array<string>();
            for(var i=0;i<this.paths.length;i++) {
                ret=ret.concat(this.paths[i].toSvgPath(this.bx,this.by));
            }
            return ret;
        }
        /**
        * 转换成GM使用的SVG格式的字符串，多个字之间以空格分隔：
        *     'path "M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90 z
        *            M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90 z"'
        */
        public toSvgPathForGM=function():string{
            var ret=this.toSvgPath();
            ret='path "'+ret+'"';
            return ret;
        }
        
        
        
    //SJG_MARK_APPEND--------------------


}//SJG_MARK_END-------------------------